<!DOCTYPE html>
<html>

<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<meta name="theme-color" content="#33474d">
	<title>失落的乐章</title>
	<link rel="stylesheet" href="/css/style.css" />
	
      <link rel="alternate" href="/atom.xml" title="失落的乐章" type="application/atom+xml">
    
</head>

<body>

	<header class="header">
		<nav class="header__nav">
			
				<a href="/archives" class="header__link">Archive</a>
			
				<a href="/tags" class="header__link">Tags</a>
			
				<a href="/atom.xml" class="header__link">RSS</a>
			
		</nav>
		<h1 class="header__title"><a href="/">失落的乐章</a></h1>
		<h2 class="header__subtitle">技术面前，永远都是学生。</h2>
	</header>

	<main>
		
	<span class="different-posts different-posts_earlier">📖 <a href="/page/20">earlier posts</a> 📖</span>




	<article>
	
		<h1><a href="/2017/10/12/Php/6. LAMP测试 php 解析/">LAMP测试 php 解析</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LAMP/">LAMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;测试是否正确解析 php ：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">vim /usr/<span class="built_in">local</span>/apache2/htdocs/1.php</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;写入：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">&lt;?php</div><div class="line"> <span class="built_in">echo</span> <span class="string">"php解析正常"</span>;</div><div class="line">?&gt;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;保存后，继续测试：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">curl localhost/1.php</div></pre></td></tr></table></figure>
<p>看是否能看到如下信息：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># curl localhost/1.php</span></div><div class="line">php解析正常</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;php 解析正常 只有显示这个信息，才算正常解析。否则就是没有成功解析。当然，也可以用真机上的浏览器通过 ip 访问，比如虚拟机 ip 为 192.168.1.101，那么在浏览器上输入 <a href="http://192.168.0.101/1.php" target="_blank" rel="external">http://192.168.0.101/1.php</a> 看是否只显示一行 php解析正常 如果访问不太顺畅，请检测 iptables 规则。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -nvL</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果有一些规则，请执行：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@localhost ~]<span class="comment"># iptables -F</span></div><div class="line">[root@localhost ~]<span class="comment"># service iptables save</span></div></pre></td></tr></table></figure>
	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/5. 一些PHP性能的优化/">一些PHP性能的优化</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LAMP/">LAMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;PHP优化对于PHP的优化主要是对php.ini中的相关主要参数进行合理调整和设置，以下我们就来看看php.ini中的一些对性能影响较大的参数应该如何设置。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">vim /etc/php.ini</div></pre></td></tr></table></figure>
<h2 id="PHP函数禁用找到："><a href="#PHP函数禁用找到：" class="headerlink" title="PHP函数禁用找到："></a>PHP函数禁用找到：</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;disable_functions = 该选项可以设置哪些PHP函数是禁止使用的，PHP中有一些函数的风险性还是相当大的，可以直接执行一些系统级脚本命令，如果允许这些函数执行，当PHP程序出现漏洞时，损失是非常严重的！以下我们给出推荐的禁用函数设置：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">disable_functions = phpinfo,passthru,<span class="built_in">exec</span>,system,popen,chroot,escapeshellcmd,escapeshellarg,shell_exec,proc_open,proc_get_status</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;需注意：如果您的服务器中含有一些系统状态检测的PHP程序，则不要禁用<code>shell_exec,proc_open,proc_get_status</code>等函数。 </p>
<h2 id="PHP脚本执行时间找到："><a href="#PHP脚本执行时间找到：" class="headerlink" title="PHP脚本执行时间找到："></a>PHP脚本执行时间找到：</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">max_execution_time = 30</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该选项设定PHP程序的最大执行时间，如果一个PHP脚本被请求，且该PHP脚本在max_execution_time时间内没能执行完毕，则PHP不再继续执行，直接给客户端返回超时错误。没有特殊需要该选项可保持默认设置30秒，如果您的PHP脚本确实需要长执行时间则可以适当增大该时间设置。 </p>
<h2 id="PHP脚本处理内存占用找到："><a href="#PHP脚本处理内存占用找到：" class="headerlink" title="PHP脚本处理内存占用找到："></a>PHP脚本处理内存占用找到：</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">memory_limit = 8M</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该选项指定PHP脚本处理所能占用的最大内存，默认为8MB，如果您的服务器内存为1GB以上，则该选项可以设置为12MB以获得更快的PHP脚本处理效率。 </p>
<h2 id="PHP全局函数声明找到："><a href="#PHP全局函数声明找到：" class="headerlink" title="PHP全局函数声明找到："></a>PHP全局函数声明找到：</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">register_globals = Off</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;网络上很多关于PHP设置的文章都推荐将该选项设置为On，其实这是一种及其危险的设置方法，很可能引起严重的安全性问题。如果没有特殊的需要，强烈推荐保留默认设置！ </p>
<h2 id="PHP上传文件大小限制找到："><a href="#PHP上传文件大小限制找到：" class="headerlink" title="PHP上传文件大小限制找到："></a>PHP上传文件大小限制找到：</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">upload_max_filesize = 2M</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;该选项设定PHP所能允许最大上传文件大小，默认为2MB。根据实际应用需求，可以适当增大该设置。 </p>
<h2 id="Session存储介质找到："><a href="#Session存储介质找到：" class="headerlink" title="Session存储介质找到："></a>Session存储介质找到：</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div><div class="line">27</div><div class="line">28</div><div class="line">29</div><div class="line">30</div><div class="line">31</div><div class="line">32</div><div class="line">33</div><div class="line">34</div><div class="line">35</div><div class="line">36</div><div class="line">37</div><div class="line">38</div><div class="line">39</div><div class="line">40</div><div class="line">41</div><div class="line">42</div><div class="line">43</div><div class="line">44</div><div class="line">45</div><div class="line">46</div><div class="line">47</div><div class="line">48</div><div class="line">49</div><div class="line">50</div><div class="line">51</div><div class="line">52</div><div class="line">53</div><div class="line">54</div><div class="line">55</div><div class="line">56</div><div class="line">57</div><div class="line">58</div><div class="line">59</div><div class="line">60</div><div class="line">61</div><div class="line">62</div><div class="line">63</div><div class="line">64</div><div class="line">65</div><div class="line">66</div><div class="line">67</div><div class="line">68</div><div class="line">69</div></pre></td><td class="code"><pre><div class="line">session.save_path</div><div class="line">``` </div><div class="line"></div><div class="line">&amp;<span class="comment">#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;如果你的PHP程序使用Session对话，则可以将Session存储位置设置为/dev/shm，/dev/shm是Linux系统独有的TMPFS文件系统，是以内存为主要存储方式的文件系统，比RAMDISK更优秀，因为可以使用DISKSWAP作为补充，而且是系统自带的功能模块，不需要另行配置。想想看，从磁盘IO操作到内存操作，速度会快多少？只是需要注意，存储在/dev/shm的数据，在服务器重启后会全部丢失。不过这对于Session来说是无足轻重的。</span></div><div class="line"> </div><div class="line">&amp;<span class="comment">#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;由于水平有限，有些还是不太明白为什么。如果有更好建议的欢迎随时补充！</span></div><div class="line">1. 用单引号代替双引号来包含字符串，这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量，单引号则不会，注意：只有<span class="built_in">echo</span>能这么做，它是一种可以把多个字符串当作参数的“函数”(译注：PHP手册中说<span class="built_in">echo</span>是语言结构，不是真正的函数，故把函数加上了双引号)。 **PS：在单引号中，PHP不会自动搜寻变量、转义字符等，因此效率上快很多。而一般来说字符串是没有变量的，所以使用双引号会导致性能不佳。**</div><div class="line"></div><div class="line">2. 如果能将类的方法定义成static，就尽量定义成static，它的速度会提升将近4倍。 **PS：事实上，<span class="keyword">function</span>、method、static method的速度不会有太大差异。具体可见“PHP函数的实现原理及性能分析【转载】”一文。**</div><div class="line"></div><div class="line">3. <span class="variable">$row</span>[’id’] 的速度是<span class="variable">$row</span>[id]的7倍。 **PS：不太懂，貌似差异只有后者会先判断id这个宏是否存在，如果不存在则自动转变为字符串。**</div><div class="line"></div><div class="line">4. <span class="built_in">echo</span> 比 <span class="built_in">print</span> 快，并且使用<span class="built_in">echo</span>的多重参数(译注：指用逗号而不是句点)代替字符串连接，比如<span class="built_in">echo</span> <span class="variable">$str1</span>,<span class="variable">$str2</span>。**PS：如果使用<span class="built_in">echo</span> <span class="variable">$str1</span>.<span class="variable">$str2</span> 就会需要 PHP 引擎首先把所有的变量连接起来，然后在输出，而<span class="built_in">echo</span> <span class="variable">$str1</span>,<span class="variable">$str2</span>，PHP 引擎就会按照循序输出他们**</div><div class="line"></div><div class="line">5. 在执行<span class="keyword">for</span>循环之前确定最大循环数，不要每循环一次都计算最大值，最好运用foreach代替。 **PS：像count、strlen这样的操作其实是O(1)的，因此不会带来太多消耗，当然避免每次循环都计算是比较好的策略。最好用foreach代替<span class="keyword">for</span>，这个效率更高，如果考虑到foreach(<span class="variable">$array</span> as <span class="variable">$var</span>)每次拷贝的消耗，可以使用foreach(<span class="variable">$array</span> as &amp;<span class="variable">$var</span>)这样的引用。**</div><div class="line"></div><div class="line">6. 注销那些不用的变量尤其是大数组，以便释放内存。 **PS：如果没有记错的话，<span class="built_in">unset</span>(<span class="variable">$array</span>)不会立刻释放内存，但随时释放是个好习惯。**</div><div class="line"></div><div class="line">7. 尽量避免使用__get，__set，__autoload。</div><div class="line"></div><div class="line">8. require_once()代价昂贵。 **PS：require_once和include_once需要判重，因此效率上要低，但是5.2版本后效率问题已经基本解决。**</div><div class="line">9. include文件时尽量使用绝对路径，因为它避免了PHP去include_path里查找文件的速度，解析操作系统路径所需的时间会更少。**PS：支持，尽量少用iniset()来设置include_path.**</div><div class="line">10. 如果你想知道脚本开始执行(译注：即服务器端收到客户端请求)的时刻，使用<span class="variable">$_SERVER</span>[<span class="string">'REQUEST_TIME'</span>]要好于time()。 **PS：<span class="variable">$_SERVER</span>[<span class="string">'REQUEST_TIME'</span>]保存了发起该请求时刻的时间戳，而time()则返回当前时刻的Unix时间戳。**</div><div class="line"></div><div class="line">11. 函数代替正则表达式完成相同功能。 **PS：这种函数是指strtok、strstr、strpos、str_replace、substr、explode、implode等等。**</div><div class="line"></div><div class="line">12. tr_replace函数比preg_replace函数快，但strtr函数的效率是str_replace函数的四倍。 **PS：字符串操作比正则替换要快。**</div><div class="line"></div><div class="line">13. 如果一个字符串替换函数，可接受数组或字符作为参数，并且参数长度不太长，那么可以考虑额外写一段替换代码，使得每次传递参数是一个字符，而不是只写一行代码接受数组作为查询和替换的参数。 **PS：需要考虑到内置函数和用户自定义函数的开销差异，恐怕这种做法得不偿失。**</div><div class="line"></div><div class="line">14. 使用选择分支语句(译注：即switch <span class="keyword">case</span>)好于使用多个<span class="keyword">if</span>，<span class="keyword">else</span> <span class="keyword">if</span>语句。 **PS：php中switch支持数值和字符串变量，比C的switch要好用，建议使用。**</div><div class="line"></div><div class="line">15. 用@屏蔽错误消息的做法非常低效，极其低效。 **PS：有什么替代方法吗？没有的话还是不得不用的……**</div><div class="line"></div><div class="line">16. 打开apache的mod_deflate模块，可以提高网页的浏览速度。</div><div class="line"></div><div class="line">17. 数据库连接当使用完毕时应关掉，不要用长连接。 **PS：在连接之前，最好设置一下相应的超时机制，例如链接超时、读写超时、等待超时等。**</div><div class="line"></div><div class="line">18. 错误消息代价昂贵。</div><div class="line"></div><div class="line">19. 在方法中递增局部变量，速度是最快的。几乎与在函数中调用局部变量的速度相当。</div><div class="line">20. 递增一个全局变量要比递增一个局部变量慢2倍。</div><div class="line"></div><div class="line">21. 递增一个对象属性(如：<span class="variable">$this</span>-&gt;prop++)要比递增一个局部变量慢3倍。</div><div class="line"></div><div class="line">22. 递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。</div><div class="line"></div><div class="line">23. 仅定义一个局部变量而没在函数中调用它，同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。</div><div class="line"></div><div class="line">24. 方法调用看来与类中定义的方法的数量无关，因为我(在测试方法之前和之后都)添加了10个方法，但性能上没有变化。</div><div class="line"></div><div class="line">25. 派生类中的方法运行起来要快于在基类中定义的同样的方法。</div><div class="line"></div><div class="line">26. 调用带有一个参数的空函数，其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。</div><div class="line"></div><div class="line">27. Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面，少用脚本。</div><div class="line"></div><div class="line">28. 除非脚本可以缓存，否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能，以免除编译开销。</div><div class="line"></div><div class="line">29. 尽量做缓存，可使用memcached。memcached是一款高性能的内存对象缓存系统，可用来加速动态Web应用程序，减轻数据库负载。对运算码 (OP code)的缓存很有用，使得脚本不必为每个请求做重新编译。</div><div class="line"></div><div class="line">30. 当操作字符串并需要检验其长度是否满足某种要求时，你想当然地会使用strlen()函数。此函数执行起来相当快，因为它不做任何计算，只返回在zval 结构(C的内置数据结构，用于存储PHP变量)中存储的已知字符串长度。但是，由于strlen()是函数，多多少少会有些慢，因为函数调用会经过诸多步骤，如字母小写化(译注：指函数名小写化，PHP不区分函数名大小写)、哈希查找，会跟随被调用的函数一起执行。在某些情况下，你可以使用isset() 技巧加速执行你的代码。</div><div class="line"></div><div class="line">&amp;<span class="comment">#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;举例如下</span></div><div class="line"></div><div class="line">```bash</div><div class="line"><span class="keyword">if</span> (strlen(<span class="variable">$foo</span>) &lt; 5) &#123; <span class="built_in">echo</span> “Foo is too short”$$ &#125;</div><div class="line"><span class="comment">#与下面的技巧做比较</span></div><div class="line"><span class="keyword">if</span> (!isset(<span class="variable">$foo</span>&#123;5&#125;)) &#123; <span class="built_in">echo</span> “Foo is too short”$$ &#125;</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;调用isset()恰巧比strlen()快，因为与后者不同的是，isset()作为一种语言结构，意味着它的执行不需要函数查找和字母小写化。也就是说，实际上在检验字符串长度的顶层代码中你没有花太多开销。 <strong>PS：长见识了。</strong></p>
<ol>
<li><p>当执行变量$i的递增或递减时，$i++会比++$i慢一些。这种差异是PHP特有的，并不适用于其他语言，所以请不要修改你的C或Java代码并指望它们能立即变快，没用的。++$i更快是因为它只需要3条指令(opcodes)，$i++则需要4条指令。后置递增实际上会产生一个临时变量，这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种，正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意，因为并不是所有的指令优化器都会做同样的优化处理，并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。</p>
</li>
<li><p>并不是事必面向对象(OOP)，面向对象往往开销很大，每个方法和对象调用都会消耗很多内存。</p>
</li>
<li><p>并非要用类实现所有的数据结构，数组也很有用。</p>
</li>
<li><p>不要把方法细分得过多，仔细想想你真正打算重用的是哪些代码?</p>
</li>
<li><p>当你需要时，你总能把代码分解成方法。 <strong>PS：分解成方法要适当，行数少使用频率高的方法尽量用直接写代码，可以减少函数堆栈开销；且方法嵌套不宜过深，否则大大影响PHP的运行效率。</strong></p>
</li>
<li><p>尽量采用大量的PHP内置函数。</p>
</li>
<li><p>如果在代码中存在大量耗时的函数，你可以考虑用C扩展的方式实现它们。</p>
</li>
<li><p>评估检验(profile)你的代码。检验器会告诉你，代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序，评估检验总体上可以显示出代码的瓶颈。</p>
</li>
<li><p>mod_zip可作为Apache模块，用来即时压缩你的数据，并可让数据传输量降低80%。</p>
</li>
<li><p>在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下，尽量用file_get_contents，因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题; <strong>PS：这个要记住，尽量使用file_get_contents和file_put_contents，不需要自己判断文件句柄打开是否成功。</strong></p>
</li>
<li><p>尽量的少进行文件操作，虽然PHP的文件操作效率也不低的;</p>
</li>
<li><p>优化Select SQL语句，在可能的情况下尽量少的进行Insert、Update操作(在update上，我被恶批过);</p>
</li>
<li><p>尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数，浪费了本可以写出一个自定义函数的时间，经验问题啊!); <strong>PS：内置函数比用户自定义函数效率高了将近一个数量级。</strong></p>
</li>
<li><p>循环内部不要声明变量，尤其是大变量：对象(这好像不只是PHP里面要注意的问题吧?); <strong>PS：这个必须的，变量过多或者过大时，每次重分配的开销就无法忽略。</strong></p>
</li>
<li><p>多维数组尽量不要循环嵌套赋值;</p>
</li>
<li><p>在可以用PHP内部字符串操作函数的情况下，不要用正则表达式;</p>
</li>
<li><p>foreach效率更高，尽量用foreach代替while和for循环;</p>
</li>
<li><p>用单引号替代双引号引用字符串; <strong>PS：晕，这个不就是第一条吗？</strong></p>
</li>
<li><p>“用i+=1代替i=i+1。符合c/c++的习惯，效率还高”;</p>
</li>
<li><p>对global变量，应该用完就unset()掉;</p>
</li>
</ol>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/4. 下载小知识/">下载小知识</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LAMP/">LAMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在官网下载的源码包都提供一个md5校验值，比如 </p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">PHP 5.3.27 (tar.bz2) [11,165Kb] - 11 Jul 2013  </div><div class="line">md5: 25ae23a5b9615fe8d33de5b63e1bb788</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这个校验值，是为了让下载者校验一下，我们下载的源码包是否改动过。如何校验呢？ 假如我们已经下载好了这个 php-5.3.27.tar.bz2  获取它的md5值得方法为：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">md5sum php-5.3.27.tar.bz2</div><div class="line">25ae23a5b9615fe8d33de5b63e1bb788 php-5.3.27.tar.bz2</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;只有这样才是正确的，否则就有问题了。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/3. 通过http上传大文件超时的问题/">通过http上传大文件超时的问题</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LAMP/">LAMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;架构是 LAMP ， 上传文件的操作，并没有连接mysql，但是却使用了php资源，所以修改设置，不仅要设置apache还要设置php.ini </p>
<ol>
<li>apache httpd.conf 的设置</li>
</ol>
<ul>
<li>Timeout 600  这个可以设置成 3600, 单位是s </li>
</ul>
<ol>
<li>php.ini 相关的参数</li>
</ol>
<ul>
<li>file_uploads  =  on  ; 默认为开</li>
<li>upload_max_filesize  =  1024M  ; 上传最大值</li>
<li>post_max_size = 1024M ; 通过表单POST给PHP的所能接收的最大值</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果还不行，那就修改以下几个参数吧。</p>
<ul>
<li>max_execution_time = 0 ; 每个php脚本的最大执行时间，单位是秒。0表示不限制</li>
<li>max_input_time = 600000  ;             传送请求数据的最大时间，秒。改的大大的…</li>
<li>memory_limit = 500M ;              一个脚本占用内存的上限。这个不建议太大。万一有攻击，你的机器就崩溃了。建议最高256M。</li>
</ul>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/2. CentOS 6 编译安装php 5.4 5.5（lamp模式）/">CentOS 6 编译安装php 5.4 5.5（lamp模式）</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LAMP/">LAMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<ol>
<li>下载php5.4</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">wget http://cn2.php.net/distributions/php-5.4.36.tar.bz2</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<a href="http://cn2.php.net/distributions/php-5.5.22.tar.bz2" target="_blank" rel="external">5.5下载地址</a></p>
<ol>
<li>解压</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">tar jxvf php-5.4.36.tar.bz2</div><div class="line"> </div><div class="line"><span class="built_in">cd</span> php-5.4.36</div></pre></td></tr></table></figure>
<ol>
<li>安装yum扩展源</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">rpm -i <span class="string">'https://www.apelearn.com/bbs/data/attachment/forum/epel-release-6-8_32.noarch.rpm'</span></div></pre></td></tr></table></figure>
<ol>
<li>安装依赖包</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install libxml2-devel libjpeg-* libpng-devel freetype-devel gd-devel libmcrypt-devel openssl-devel</div></pre></td></tr></table></figure>
<ol>
<li>配置编译参数</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div></pre></td><td class="code"><pre><div class="line">./configure --prefix=/usr/<span class="built_in">local</span>/php \</div><div class="line"> --with-apxs2=/usr/<span class="built_in">local</span>/apache2/bin/apxs \</div><div class="line"> --with-config-file-path=/usr/<span class="built_in">local</span>/php/etc \</div><div class="line"> --with-mysql=/usr/<span class="built_in">local</span>/mysql \</div><div class="line"> --with-libxml-dir \</div><div class="line"> --with-gd \</div><div class="line"> --with-jpeg-dir \</div><div class="line"> --with-png-dir \</div><div class="line"> --with-freetype-dir \</div><div class="line"> --with-iconv-dir \</div><div class="line"> --with-zlib-dir \</div><div class="line"> --with-bz2 \</div><div class="line"> --with-openssl \</div><div class="line"> --with-mcrypt \</div><div class="line"> --<span class="built_in">enable</span>-soap \</div><div class="line"> --<span class="built_in">enable</span>-gd-native-ttf \</div><div class="line"> --<span class="built_in">enable</span>-mbstring \</div><div class="line"> --<span class="built_in">enable</span>-sockets \</div><div class="line"> --<span class="built_in">enable</span>-exif \</div><div class="line"> --<span class="built_in">disable</span>-ipv6</div></pre></td></tr></table></figure>
<ol>
<li>编译安装</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">make &amp;&amp; make install</div></pre></td></tr></table></figure>
	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/16. CGI、FastCGI与php-fpm/">CGI、FastCGI与php-fpm</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/MySQL/">MySQL</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;这几个概念是在学习lamp、lnmp架构中我们遇到的。好多同学对这几个概念一直不明白。下面内容希望能帮助到到家，其中一些内容参考网上的文章。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在web开发领域中有个大概念大家必须要搞清楚，那就是静态和动态。静态就是一些诸如html、图片、js、css等请求元素，它们的特点是不需要和其他资源（比如数据库）打交道，可以直接由web server（httpd、nginx等）处理。如下图：</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/CGI%E3%80%81FastCGI%E4%B8%8Ephp-fpm/01.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;而动态则是需要和数据库等资源打交道的请求，在lamp/lnmp架构中，需要一个中间件（PHP解释器）去解析php代码，然后和mysql数据库打交道。如图：</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/CGI%E3%80%81FastCGI%E4%B8%8Ephp-fpm/02.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;当Web Server收到 index.php 这个请求后，会启动对应的 CGI 程序，这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件，初始化执行环境，然后处理请求，再以规定CGI规定的格式返回处理后的结果，退出进程，Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程，接下来再引出这些概念，就好理解多了。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;再来解释几个概念：</p>
<ul>
<li><p>CGI：是 Web Server 与 Web Application 之间数据交换的一种协议。</p>
</li>
<li><p>FastCGI：同 CGI，是一种通信协议，但比 CGI 在效率上做了一些优化。同样，SCGI 协议与 FastCGI 类似。</p>
</li>
<li><p>PHP-CGI：是 PHP （Web Application）对 Web Server 提供的 CGI 协议的接口程序。</p>
</li>
<li><p>PHP-FPM：是 PHP（Web Application）对 Web Server 提供的 FastCGI 协议的接口程序，额外还提供了相对智能一些任务管理。</p>
</li>
</ul>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;WEB 中，Web Server 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器，Web Application 一般指PHP、Java、Asp.net等应用程序。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在这里还要了解另外一种方式 —— Apache的Module方式。 lamp架构中，php是以一个模块（libphp5.so）的方式被httpd调用的，这个模块是通过sapi把数据交给了php的解释器。</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/CGI%E3%80%81FastCGI%E4%B8%8Ephp-fpm/03.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;SAPI提供了一个和外部通信的接口，有点类似于socket，使得PHP可以和其他应用进行交互数据（apache，nginx等）。php默认提供了很多种SAPI，常见的提供给apache和nginx的php5_module、CGI、FastCGI，给IIS的ISAPI，以及Shell的CLI。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最后再来说一说，FastCGI为什么比CGI优秀。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;不管是CGI还是FastCGI都是专门用来和WEB服务器打交道的，web服务器收到用户请求，就会把请求提交给cgi/fastcgi程序（如php-cgi），cgi/fastcgi程序根据请求提交的参数作应处理（解析php），然后输出标准的html语句，返回给web服服务器，WEB服务器再返回给客户端，这就是普通cgi/fastcgi的工作原理。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;cgi和fastcgi不同在于，cgi需要在每一次WEB服务器把请求交给它时都需要启动一次进程，然后处理结束后还要关闭进程。这样当并发量很大时，就会造成服务器资源耗费严重。而fastcgi则为常驻进程，也就是说进程启动后会一直在线，不用频繁开启和关闭。另外fastcgi还支持分布式，也就是说可以支持在web服务器外的其他服务器上运行，通过tcp传输数据。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/14. php-fpm配置文件/">php-fpm配置文件</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LNMP/">LNMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;之前给出了 php-fpm.conf 的内容，下面给出一个模版，配置如下</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div></pre></td><td class="code"><pre><div class="line">[global]</div><div class="line">pid = /usr/<span class="built_in">local</span>/php/var/run/php-fpm.pid</div><div class="line">error_log = /usr/<span class="built_in">local</span>/php/var/<span class="built_in">log</span>/php-fpm.log</div><div class="line">[www]</div><div class="line">listen = /tmp/php-fcgi.sock</div><div class="line">user = php-fpm</div><div class="line">group = php-fpm</div><div class="line">listen.owner = nobody //和后面的nginx一致</div><div class="line">listen.group = nobody //同上</div><div class="line">pm = dynamic</div><div class="line">pm.max_children = 50</div><div class="line">pm.start_servers = 20</div><div class="line">pm.min_spare_servers = 5</div><div class="line">pm.max_spare_servers = 35</div><div class="line">pm.max_requests = 500</div><div class="line">rlimit_files = 1024</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明</strong></p>
<ul>
<li>[global]  部分是全局配置，指定 pid 文件路径以及 error_log 路径。</li>
<li>[www] 是一个 pool ，还可以再写第二个 pool ，第二个 pool 和第一个不易演的的地方，首先 pool 的 name ，比如叫做  [www2] 。然后 listen 肯定就不能一样了，比如 可以 listen = /tmp/php-fcgi2.sock 。而 user ， group 也可以和   [www] 中定义的不一样。 listen.owner 这个是定义 /tmp/php-fcgi2.sock 这个文件的所有者是谁，在 php5.4 版本之后监听的 socket 文件权限默认变成了 600，如果不定义 listen.owner 那么 nginx 调用这个 socket 的时候就没有权限了，所以在这里定义 listen.owner 为 nginx 的子进程监听用户。</li>
<li>pm = dynamic 表示以动态的形式启动，在 php5.3 版本以后它可以支持动态和静态了，如果是静态，即 pm = static 时，下面的配置只有 pm.max.children 管用。</li>
<li>pm.max.children 表示启动几个 php-fpm 的子进程。如果是 dynamic ，下面的配置会生效，pm.max.children 表示最大可以启动几个子进程。</li>
<li>pm.start_servers 表示一开始启动几个子进程。</li>
<li>pm.max_requeste 表示一个子进程最多可以接受多少个请求，比如设置为500那么一个子进程手里500个请求后自动销毁。</li>
<li>rlimit_files 表示每个子进程打开的多少个文件句柄。</li>
</ul>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">slowlog = /tmp/www_slow.log</div><div class="line">request_slowlog_timeout = 1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;表示一个脚本执行时间超过 1秒就要记录这个slow.log ，记录这个可以看到这个脚本哪里执行慢，可以通过slow.log排查网站慢的原因，根据这个原因做一定的优化。</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">php_admin_value [open_basedir] = /data/www/:/tmp</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;apache 可以设置 open_basedir ，php-fpm也可以，不同的 pool 设置不同的 open_basedir 可以针对不同的域名进行不同的限制。多个目录用 ：分割。</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/15. php中几个和mysql相关的扩展模块/">php中几个和mysql相关的扩展模块</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/MySQL/">MySQL</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在编译php的时候，有这么几个和mysql相关的编译选项：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">--with-mysql</div><div class="line">--with-mysqli</div><div class="line">--with-pdo-mysql</div><div class="line">--<span class="built_in">enable</span>-mysqlnd</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;那这几个选项到底有什么不同呢？</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;php官方文档上有这么一段话：</p>
<blockquote>
<p>MySQL:This extension is deprecated as of PHP 5.5.0, and has been removed as of php 7.0.0.<br>MYSQLI: mysql Improved Extension<br>MySQLND: MySQL Native Drive<br>PDO:The PHP Data Objects。extension defines a lightweight, consistent interface for accessing databases in PHP。</p>
</blockquote>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;翻译成中文大概意思是：</p>
<blockquote>
<p>MySQL扩展：在5.5.0版本中开始废弃，7.0.0版本中已经移除（也就是不支持了）<br>MySQLI扩展：是mysql扩展的增强版<br>MySQLnd：这是官方驱动，或者叫做原生驱动<br>PDO：PHP Data Objects，是PHP应用中的一个数据库抽象层规范</p>
</blockquote>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在PHP扩展的角度上看，MYSQL和MYSQLi还是比较上层的扩展，依赖更底层的库去连接和访问数据库。 MYSQLND 就是所说的底层的数据库驱动。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;从应用的层面上看，我们通过PHP 的MYSQL或者MYSQLi扩展提供的API去操作数据库。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;从底层来看，MYSQLND提供了底层和数据库交互的支持(可以简单理解为和MySQL server进行网络协议交互)。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;而PDO，则提供了一个统一的API接口，使得你的PHP应用不去关心具体要连接的数据库服务器系统类型。也就是说，如果你使用PDO的API，可以在任何需要的时候无缝切换数据库服务器。比如MYSQL,SQLITE任何数据库都行。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;即从大部分功能上看，PDO提供的API接口和MYSQLI提供的接口对于普通的增删改查效果是一致的。</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;最后再贴几个php的代码，来区分几个扩展的用法：</p>
<ol>
<li>mysql连接</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div></pre></td><td class="code"><pre><div class="line">&lt;?php</div><div class="line"><span class="variable">$conn</span> = @ mysql_connect(<span class="string">"localhost"</span>, <span class="string">"root"</span>, <span class="string">""</span>) or die(<span class="string">"数据库连接错误"</span>);</div><div class="line">mysql_select_db(<span class="string">"bbs"</span>, <span class="variable">$conn</span>);</div><div class="line">mysql_query(<span class="string">"set names 'utf8'"</span>);</div><div class="line"><span class="built_in">echo</span> <span class="string">"数据库连接成功"</span>;</div><div class="line">?&gt;</div></pre></td></tr></table></figure>
<ol>
<li>mysqli连接</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">&lt;?php</div><div class="line"><span class="variable">$conn</span> = mysqli_connect(<span class="string">'localhost'</span>, <span class="string">'root'</span>, <span class="string">''</span>, <span class="string">'bbs'</span>);</div><div class="line"><span class="keyword">if</span>(!<span class="variable">$conn</span>)&#123;</div><div class="line">    die(<span class="string">"数据库连接错误"</span> . mysqli_connect_error());</div><div class="line">&#125;</div><div class="line"><span class="keyword">else</span>&#123;</div><div class="line">    <span class="built_in">echo</span><span class="string">"数据库连接成功"</span>;</div><div class="line">&#125;</div><div class="line">?&gt;</div></pre></td></tr></table></figure>
<ol>
<li>PDO连接</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div></pre></td><td class="code"><pre><div class="line">&lt;?php</div><div class="line">try&#123;</div><div class="line">    <span class="variable">$pdo</span>=new pdo(<span class="string">"mysql:host=localhost;dbname=bbs"</span>,<span class="string">"root"</span>,<span class="string">""</span>);</div><div class="line">&#125;</div><div class="line">catch(PDDException <span class="variable">$e</span>)&#123;</div><div class="line">    <span class="built_in">echo</span><span class="string">"数据库连接错误"</span>;</div><div class="line">&#125;</div><div class="line"><span class="built_in">echo</span><span class="string">"数据库连接成功"</span>;</div><div class="line">?&gt;</div></pre></td></tr></table></figure>
	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/13. LNMP- php编译安装/">LNMP- php编译安装</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LNMP/">LNMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先针对 nginx 的 php 安装和针对 apache 的 php 安装是有区别的，因为 nginx 中的 php 是以 fastcgi 的方式结合 nginx 的。可以理解为 nginx 代理了 php 的 fastcgi ，而 apache 是把 php 作为子机的模块来调用的。<a href="http://www.php.net/downloads.php" target="_blank" rel="external">php官方下载地址</a></p>
<h2 id="1-下载-php-源码包"><a href="#1-下载-php-源码包" class="headerlink" title="1.下载 php 源码包"></a>1.下载 php 源码包</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">[root@lnmp ~]<span class="comment"># cd /usr/local/src</span></div><div class="line">[root@lnmp src]<span class="comment"># wget http://aul.php.net/distributions/php-5.4.44.tar.bz2</span></div></pre></td></tr></table></figure>
<h2 id="2-解压源码包"><a href="#2-解压源码包" class="headerlink" title="2.解压源码包"></a>2.解压源码包</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lnmp src]<span class="comment"># tar jxf php.5.4.44.tar.bz2</span></div></pre></td></tr></table></figure>
<h2 id="3-创建相关帐号"><a href="#3-创建相关帐号" class="headerlink" title="3.创建相关帐号"></a>3.创建相关帐号</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lnmp src]<span class="comment"># useradd -s /sbin/nologin php-fpm</span></div></pre></td></tr></table></figure>
<h2 id="4-依赖包安装"><a href="#4-依赖包安装" class="headerlink" title="4.依赖包安装"></a>4.依赖包安装</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y bzip2-devel curl-devel db4-devel libjpeg-devel libpng-devel libXpm-devel gmp-devel libc-client-devel openldap-devel unixODBC-devel postgresql-devel sqlite-devel aspell-devel net-snmp-devel libxslt-devel libxml2-devel pcre-devel mysql-devel unixODBC-devel postgresql-devel pspell-devel net-snmp-devel freetype-devel libtomcrypt-devel.x86_64 php-mcrypt libmcrypt libmcrypt-devel</div></pre></td></tr></table></figure>
<h2 id="5-配置编译参数"><a href="#5-配置编译参数" class="headerlink" title="5.配置编译参数"></a>5.配置编译参数</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div><div class="line">15</div><div class="line">16</div><div class="line">17</div><div class="line">18</div><div class="line">19</div><div class="line">20</div><div class="line">21</div><div class="line">22</div><div class="line">23</div><div class="line">24</div><div class="line">25</div><div class="line">26</div></pre></td><td class="code"><pre><div class="line">[root@lnmp src]<span class="comment"># cd php-5.4.44</span></div><div class="line">[root@lnmp php-5.4.44]<span class="comment"># ./configure \</span></div><div class="line">--prefix=/usr/<span class="built_in">local</span>/php \</div><div class="line">--with-config-file-path=/usr/<span class="built_in">local</span>/php/etc \</div><div class="line">--<span class="built_in">enable</span>-fpm \</div><div class="line">--with-fpm-user=php-fpm \</div><div class="line">--with-fpm-group=php-fpm \</div><div class="line">--with-mysql=/usr/<span class="built_in">local</span>/mysql \</div><div class="line">--with-mysql-sock=/tmp/mysql.sock \</div><div class="line">--with-libxml-dir \</div><div class="line">--with-gd \</div><div class="line">--with-jpeg-dir \</div><div class="line">--with-png-dir \</div><div class="line">--with-freetype-dir \</div><div class="line">--with-iconv-dir \</div><div class="line">--with-zlib-dir \</div><div class="line">--with-mcrypt \</div><div class="line">--<span class="built_in">enable</span>-soap \</div><div class="line">--<span class="built_in">enable</span>-gd-native-ttf \</div><div class="line">--<span class="built_in">enable</span>-ftp \</div><div class="line">--<span class="built_in">enable</span>-mbstring \</div><div class="line">--<span class="built_in">enable</span>-exif \</div><div class="line">--<span class="built_in">disable</span>-ipv6 \</div><div class="line">--with-pear \</div><div class="line">--with-curl \</div><div class="line">--with-openssl</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在该过程中，若出现和 lamp 安装 php 的错误一样的错误参照 lamp 的方法来解决，若出现如下错误，参考下面解决办法：</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;错误信息：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">configure: error: Please reinstall the libcurl distribution -</div><div class="line"> easy.h should be <span class="keyword">in</span> &lt;curl-dir&gt;/include/curl/</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;解决办法：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y libcurl-devel</div></pre></td></tr></table></figure>
<h2 id="6-编译-php"><a href="#6-编译-php" class="headerlink" title="6.编译 php"></a>6.编译 php</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lnmp php-5.4.44]<span class="comment"># make</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;在这一步，通常会遇到一些错误：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">/usr/bin/ld: cannot find -lltdl</div><div class="line">collect2: ld returned 1 <span class="built_in">exit</span> status</div><div class="line">make: *** [sapi/fpm/php-fpm] 错误 1</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;解决办法：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">yum install -y libtool-ltdl-devel</div></pre></td></tr></table></figure>
<h2 id="7-安装-php"><a href="#7-安装-php" class="headerlink" title="7.安装 php"></a>7.安装 php</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lnmp php-5.4.44]<span class="comment"># make install</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;以上每一步骤，如果没有完全执行正确，那么下一步是无法进行的，使用 echo $? 看结果是否为 “0”，如果不是，就是没有执行正确。</p>
<h2 id="8-修改配置文件"><a href="#8-修改配置文件" class="headerlink" title="8.修改配置文件"></a>8.修改配置文件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">cp php.ini-production /usr/<span class="built_in">local</span>/php/etc/php.ini</div><div class="line">vim /usr/<span class="built_in">local</span>/php/etc/php-fpm.conf</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;添加如下内容：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div><div class="line">5</div><div class="line">6</div><div class="line">7</div><div class="line">8</div><div class="line">9</div><div class="line">10</div><div class="line">11</div><div class="line">12</div><div class="line">13</div><div class="line">14</div></pre></td><td class="code"><pre><div class="line">[global]</div><div class="line">pid = /usr/<span class="built_in">local</span>/php/var/run/php-fpm.pid</div><div class="line">error_log = /usr/<span class="built_in">local</span>/php/var/<span class="built_in">log</span>/php-fpm.log</div><div class="line">[www]</div><div class="line">listen = /tmp/php-fcgi.sock</div><div class="line">user = php-fpm</div><div class="line">group = php-fpm</div><div class="line">pm = dynamic</div><div class="line">pm.max_children = 50</div><div class="line">pm.start_servers = 20</div><div class="line">pm.min_spare_servers = 5</div><div class="line">pm.max_spare_servers = 35</div><div class="line">pm.max_requests = 500</div><div class="line">rlimit_files = 1024</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;保存配置文件后，检验配置是否正确的方法为：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">/usr/<span class="built_in">local</span>/php/sbin/php-fpm -t</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果出现诸如 “test is successful” 字样，说明配置没有问题。</p>
<h2 id="9-启动-php-fpm"><a href="#9-启动-php-fpm" class="headerlink" title="9.启动 php-fpm"></a>9.启动 php-fpm</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先要拷贝一个启动脚本到 /etc/init.d 下</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">cp /usr/<span class="built_in">local</span>/src/php-5.4.44/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;更改权限为755</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div></pre></td><td class="code"><pre><div class="line">chmod 755 /etc/init.d/php-fpm</div><div class="line">service php-fpm start</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;如果要它开机启动，执行：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">chkconfig php-fpm on</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;检测是否成功：</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">ps aux |grep php-fpm</div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;看看是不是有很多进程</p>

	

	

</article>




	<article>
	
		<h1><a href="/2017/10/12/Php/12. php 扩展模块如何安装/">php 扩展模块如何安装</a></h1>
	
	<div class="article__infos">
		<span class="article__date">2017-10-12</span><br />
		
		
			<span class="article__tags">
			  	<a class="article__tag-link" href="/tags/LAMP/">LAMP</a> <a class="article__tag-link" href="/tags/Php/">Php</a>
			</span>
		
	</div>

	

	
		<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;php 和 apapche 类似，核心文件为 /usr/local/php/bin/php ,针对 apache 的是 /usr/local/apache2/modules/libphp5.so 模块。这两个文件是核心，在编译 php 的时候会提前让它支持一些功能，比如支持 mysql，这个功能其实是 php 的一个模块，只不过这个模块是直接和 php 或者 libphp5.so 文件编译在一起的。当我们编译完成 php 后，发现还需要让 php 支持另外的模块，这时候可以重新编译 php ，加上配置参数，或者直接编译出一个独立的模块文件。然后让 php去调用它。下面以编译 memcache 为例；</p>
<p>1.下载 memcache 源码包</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp src]<span class="comment"># wget http://www.apelearn.com/bbs/data/attachment/forum/memcache-2.2.3.tgz</span></div></pre></td></tr></table></figure>
<ol>
<li>安装</li>
</ol>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div></pre></td><td class="code"><pre><div class="line">[root@lamp src]<span class="comment"># tar zxvf memcache-2.2.3.tgz </span></div><div class="line">[root@lamp src]<span class="comment"># cd memcache-2.2.3</span></div><div class="line">[root@lamp memcache-2.2.3]<span class="comment"># /usr/local/php/bin/phpize</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;<strong>说明：这一步是借助 php 的 phpize 工具生成 configure 文件。在这一步可能会遇到一些错误，不如 “Cannot find config.m4”，这是因为系统还没有安装 m4 工具，使用 yum 安装</strong></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># yum install -y m4</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;还有错误“Cannot find autoconf” ，解决办法是</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div><div class="line">2</div><div class="line">3</div><div class="line">4</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># yum install -y autoconf</span></div><div class="line"></div><div class="line">[root@lamp memcache-2.2.3]<span class="comment"># ./configure --with-php-config=/usrl/local/php/bin/php-config</span></div><div class="line">[root@lamp memcache-2.2.3]<span class="comment"># make &amp;&amp; make install</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;说明：当 make install 后会生成一个 memcache.so 的模块文件，该文件在 php 的 extension_dir 下。查看 php extension_dir 的方法是</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># /usr/local/php/bin/php -i | grep extension_dir</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/01.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;修改 extension_dir 的方法是，编辑 php.ini 文件</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp lamp]<span class="comment"># vim /usr/local/php/etc/php.ini</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/02.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;修改为（一般情况不做修改）</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/03.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;然后继续在 php.ini 中添加</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">extension=memcache.so</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/04.png?raw=true" alt=""></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/05.png?raw=true" alt=""></figure></p>
<h2 id="还有就是重新动态编译-php-自带模块"><a href="#还有就是重新动态编译-php-自带模块" class="headerlink" title="还有就是重新动态编译 php 自带模块"></a>还有就是重新动态编译 php 自带模块</h2><p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;首先找到 php 的源码包</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ~]<span class="comment"># cd /usr/local/src/php-5.6.6</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;很多模块的源码都是 /ext 目录下</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp php-5.6.6]<span class="comment"># cd ext/</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/06.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;现在编译一下 curl 模块</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ext]<span class="comment"># /usr/local/php/bin/php -m | grep -i curl</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;进入 curl 目录</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp ext]<span class="comment"># cd curl/</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/07.png?raw=true" alt=""></figure></p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp curl]<span class="comment"># /usr/local/php/bin/phpize</span></div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/08.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;上面这步是为了生成  configure 文件，没有这个文件是没办法编译的</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/09.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;编译</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp curl]<span class="comment"># ./configure --with-php-config=/usr/local/php/bin/php-config</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;安装</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp curl]<span class="comment"># make &amp;&amp; make install</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;编译安装完成，最后一排会有模块目录</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/10.png?raw=true" alt=""></figure></p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/11.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;加载模块</p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;编辑 php.ini</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">[root@lamp curl]<span class="comment"># vim /usr/local/php/etc/php.ini</span></div></pre></td></tr></table></figure>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;增加内容</p>
<figure class="highlight bash"><table><tr><td class="gutter"><pre><div class="line">1</div></pre></td><td class="code"><pre><div class="line">extension=curl.so</div></pre></td></tr></table></figure>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/12.png?raw=true" alt=""></figure></p>
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;查看是否加载成功</p>
<p><figure class="figure"><img src="https://github.com/hcldirgit/image/blob/master/php%20%E6%89%A9%E5%B1%95%E6%A8%A1%E5%9D%97%E5%A6%82%E4%BD%95%E5%AE%89%E8%A3%85/13.png?raw=true" alt=""></figure></p>

	

	

</article>





	<span class="different-posts">📖 <a href="/page/22">more posts</a> 📖</span>



	</main>

	<footer class="footer">
	<div class="footer-content">
		
	      <div class="footer__element">
	<p>Hi there, <br />welcome to my Blog glad you found it. Have a look around, will you?</p>
</div>

	    
	      <div class="footer__element">
	<h5>Check out</h5>
	<ul class="footer-links">
		<li class="footer-links__link"><a href="/archives">Archive</a></li>
		
		  <li class="footer-links__link"><a href="/atom.xml">RSS</a></li>
	    
		<li class="footer-links__link"><a href="/about">about page</a></li>
		<li class="footer-links__link"><a href="/tags">Tags</a></li>
		<li class="footer-links__link"><a href="/categories">Categories</a></li>
	</ul>
</div>

	    

		<div class="footer-credit">
			<span>© 2017 失落的乐章 | Powered by <a href="https://hexo.io/">Hexo</a> | Theme <a href="https://github.com/HoverBaum/meilidu-hexo">MeiliDu</a></span>
		</div>

	</div>


</footer>



</body>

</html>
